package com.qf.course.core.service.impl;

import com.qf.course.core.dao.CourseDao;
import com.qf.course.core.entity.Course;
import com.qf.course.core.entity.CourseApply;
import com.qf.course.core.service.CourseApplyService;
import com.qf.course.core.service.CourseService;
import com.qf.course.core.util.ApplyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 课程表(Course)表服务实现类
 *
 * @author makejava
 * @since 2022-08-04 10:43:34
 */
@Service
public class CourseServiceImpl implements CourseService {

    @Resource
    private CourseDao courseDao;

    @Autowired
    private CourseApplyService courseApplyService;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Course queryById(Integer id) {
        return this.courseDao.queryById(id);
    }


    /**
     * 新增数据
     *
     * @param course 实例对象
     * @return 实例对象
     */
    @Override
    public Course insert(Course course) {
        this.courseDao.insert(course);

        //如果新增课程成功，将该课程最大申请人数，放到本地内存
        ApplyUtils.setCourse(course.getId(), course.getApplyNumber());

        return course;
    }

    /**
     * 修改数据
     *
     * @param course 实例对象
     * @return 实例对象
     */
    @Override
    public Course update(Course course) {
        this.courseDao.update(course);
        return this.queryById(course.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.courseDao.deleteById(id) > 0;
    }

    /**
     * 查询所有课程
     * @return
     */
    @Override
    public List<Course> queryAll() {
        return courseDao.queryAll();
    }

    /**
     *
     * @return
     */
    @Override
    public List<Course> queryAllByStu(Integer sid) {
        return courseDao.queryAllByStu(sid);
    }

    /**
     * 根据课程id列表，批量删除
     * @param ids
     * @return
     */
    @Override
    public int deletes(int[] ids) {
        return courseDao.deletes(ids);
    }

    /**
     * 学生申请课程
     * @param uid
     * @param cid
     * @param type
     * @return
     */
    @Override
    public int courseApply(Integer uid, Integer cid, Integer type) {
        //课程 15 14
        //课程申请的实体类
        if (type == 0){
//            //判断当前是否已经申请满了
//            //1、根据课程id 查询最大的申请人数
//            Course course = this.queryById(cid); //会给数据库添加行锁 记录id为50的这一行
//            //2、查询当前申请的人数
//            int applyNumber = courseDao.queryApplyNumberByCid(cid);
//
//            //判断是否申请已满
//            if (applyNumber >= course.getApplyNumber()) {
//                //返回人数已满
//                return -1;
//            }
//
//            //申请课程
//            CourseApply courseApply = new CourseApply()
//                    .setSid(uid)
//                    .setCid(cid);
//            courseApplyService.insert(courseApply);

            int result = ApplyUtils.apply(cid);
            if (result >= 0) {
                //成功
                new Thread(() -> {
                    CourseApply courseApply = new CourseApply()
                            .setSid(uid)
                            .setCid(cid);
                    courseApplyService.insert(courseApply);
                }).start();
            } else {
                //人数已满
                return -1;
            }
            return 1;
        } else {
            //取消申请课程
            courseApplyService.deleteById(uid, cid);
            return 2;
        }
    }

    /**
     * 根据学生id查询课程申请列表
     * @param sid
     * @return
     */
    @Override
    public List<CourseApply> queryCourseApply(Integer sid) {
        return courseDao.queryCourseApply(sid);
    }

    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        System.out.println((a + "").intern() == (b + "").intern());
    }
}
